class Set {
constructor() {
  // 创建一个对象
  this.items = {};
}

// 判断集合中是否存在 value 值，存在返回 true，否则返回 false
// hasOwnProperty表示是否有自己的属性
has(value) {
  return this.items.hasOwnProperty(value);
}

// add(value) 往集合中添加 value
// 这里已经表明set集合是不能重复的
add(value) {
  if (this.has(value)) return false;
  this.items[value] = value;
  return true;
}

// remove(value) 删除集合中指定的 value
remove(value) {
  // 如果集合不存在该 value，返回 false
  if (!this.has(value)) return false;
  // delete 操作符用于删除对象的某个属性
  delete this.items[value];
}

// clear() 清空集合中所有 value
clear() {
  this.items = {};
}

// size() 获取集合中的 value 个数
size() {
  // Object.keys(对象/数组/) 返回对象的属性
  return Object.keys(this.items).length;
}

// values() 获取集合中所有的 value  我觉得是keys
values() {
  return Object.keys(this.items);
}
}

const set = new Set();

// add() 测试
set.add("abc");
set.add("abc");
set.add("123");
set.add("zxc");
console.log(set);
console.log(set.has(123));
set.remove("abc");
console.log(set);
console.log(set.values()); //--> ["123", "zxc"]

//并集
// union() 求两个集合的并集
function union(otherSet){
  // 1、创建一个新集合
  let unionSet = new Set();
  // 2、将当前集合（this）的所有 value，添加到新集合（unionSet）中
  for (let value of this.values()) {
    unionSet.add(value);
  }
  // 3、将 otherSet 集合的所有 value，添加到新集合（unionSet）中
  for (let value of otherSet.values()) {
    unionSet.add(value); // add() 已经有重复判断
  }
  return unionSet;
}

// 交集
// intersection() 求两个集合的交集
function intersection(otherSet) {
  // 1、创建一个新集合
  let intersectionSet = new Set();
  // 2、从当前集合中取出每一个 value，判断是否在 otherSet 集合中存在
  for (let value of this.values()) {
    if (otherSet.has(value)) {
      intersectionSet.add(value);
    }
  }
  return intersectionSet;
}